<?php

class UsuarioController extends Controller {
    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'usuario';

    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var FerramentaService
     */
    private $ferramentaService;
    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var FuncaoService
     */
    private $funcaoService;
    /**
     * @var AtendimentoService
     */
    private $atendimentoService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por UsuarioController
     */
    public function __construct() {
        $this->usuarioService = UsuarioService::getInstance();
        $this->ferramentaService = FerramentaService::getInstance();
        $this->setorService = SetorService::getInstance();
        $this->departamentoService = DepartamentoService::getInstance();
        $this->funcaoService = FuncaoService::getInstance();
        $this->atendimentoService = AtendimentoService::getInstance();
    }

    /**
     * @method  showIndex
     *
     * Exibe a home padrao do sistema
     *
     * @since   Setembro de 2011
     */
    public function showIndex() {
        $this->view('usuario', self::PACKAGE_VIEW);
    }

    /**
     * View que permite o usuario logado editar seus proprios dados
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Outubro de 2011
     */
    public function dados() {
        $this->view('dados', self::PACKAGE_VIEW);
    }

    /**
     * View que permite o usuario logado trocar sua propria senha
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function trocarSenha() {
        $this->view('trocar_senha', self::PACKAGE_VIEW);
    }

    /**
     * @method  preferencias
     *
     * View que permite alterar as preferencias do usuario  e as ferramentas
     * habilitadas, faz o pre-carregamento da lista de ferramentas do sistema
     * utilizando o servico.
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function preferencias() {
        $ArFerramentas = $this->ferramentaService->findAll();
        $this->save(SESSION_INTERFACE, 'ArFerramentas', $ArFerramentas);
        $this->view('preferencias', self::PACKAGE_VIEW);
    }

    /**
     * @method  atribuicoes
     *
     * View que permite ao usuario logado ver suas atribuicoes
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public function atribuicoes() {
        $this->view('atribuicoes', self::PACKAGE_VIEW);
    }

    public function relatorios() {
        $Report = $this->atendimentoService->generateReportFromLoggedUser();
        $this->save(SESSION_INTERFACE, 'Report', $Report );
        $this->view('relatorio', self::PACKAGE_VIEW);
    }

    /**
     * @method  editarDados
     *
     * Manipula o post para edicao de dados do usuario
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function editarDados() {
        $ArDados = $_POST;
        if (empty($ArDados['StNome'])) {
            $this->saveReturn('Campo "Nome" é obrigatório');
        } else if (empty($ArDados['DtNascimento'])) {
            $this->saveReturn('Campo "Nascimento" é obrigatório');
        } else if (empty($ArDados['StCpf'])) {
            $this->saveReturn('Campo "Cpf" é obrigatório');
        } else if (empty($ArDados['StRg'])) {
            $this->saveReturn('Campo "Rg" é obrigatório');
        } else if (empty($ArDados['StEndereco'])) {
            $this->saveReturn('Campo "Endereço" é obrigatório');
        } else if (empty($ArDados['StNumero'])) {
            $this->saveReturn('Campo "Número" é obrigatório');
        } else if (empty($ArDados['StBairro'])) {
            $this->saveReturn('Campo "Bairro" é obrigatório');
        } else if (empty($ArDados['StEstado'])) {
            $this->saveReturn('Campo "Estado" é obrigatório');
        } else if (empty($ArDados['StCep'])) {
            $this->saveReturn('Campo "Cep" é obrigatório');
        } else if (empty($ArDados['StEmail'])) {
            $this->saveReturn('Campo "Email" é obrigatório');
        } else if (empty($ArDados['StDDDTelefone'])) {
            $this->saveReturn('Campo "DDD Telefone" é obrigatório');
        } else if (empty($ArDados['StTelefone'])) {
            $this->saveReturn('Campo "Telefone" é obrigatório');
        } else if (empty($ArDados['StDDDCelular'])) {
            $this->saveReturn('Campo "DDD Celular" é obrigatório');
        } else if (empty($ArDados['StCelular'])) {
            $this->saveReturn('Campo "Celular" é obrigatório');
        } else {
            if (!Validation::Email($ArDados['StEmail'])) {
                $this->saveReturn('Email em formato inv&aacute;lido.');
            } else if (!Validation::Date($ArDados['DtNascimento'])) {
                $this->saveReturn('Nascimento em formato inv&aacute;lido.');
            } else if (!Validation::Cep($ArDados['StCep'])) {
                $this->saveReturn('Cep em formato inv&aacute;lido.');
            } else if (!Validation::Phone($ArDados['StTelefone'])) {
                $this->saveReturn('Telefone em formato inv&aacute;lido.');
            } else if (!Validation::Phone($ArDados['StCelular'])) {
                $this->saveReturn('Celular em formato inv&aacute;lido.');
            } else if (!empty($ArDados['ItRamal']) && !Validation::Number($ArDados['ItRamal'])) {
                $this->saveReturn('Ramal em formato inv&aacute;lido.');
            } else if (!Validation::Cpf($ArDados['StCpf'])) {
                $this->saveReturn('CPF em formato inv&aacute;lido.');
            }
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            $ArDados['DtNascimento'] = dateBRtoBD($ArDados['DtNascimento']);
            if ($this->usuarioService->updatePessoalData($ArDados)) {
                $this->saveReturn('Usu&aacute;rio atualizado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao atualizar cadastro', 0);
            }
        }
        $this->showJsonResponse();
    }

    /**
     * @method  editarSenha
     *
     * Manipula o post para edicao de senha do usuario
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function editarSenha() {
        $Usuario = Dracosys::getLoggedUser();
        $ArDados = $_POST;
        if (empty($ArDados['StSenhaAntiga'])) {
            $this->saveReturn('Senha antiga não recebida.');
        } else if (empty($ArDados['StNovaSenha'])) {
            $this->saveReturn('A Nova Senha não foi recebida');
        } else if (empty($ArDados['StConfirmacao'])) {
            $this->saveReturn('A Confirmação da senha não foi recebida');
        } else if ($Usuario->getArDadosUsuario('StSenha') != $ArDados['StSenhaAntiga']) {
            $this->saveReturn('Sua atual senha não confere com a armazenada');
        } else if ($ArDados['StConfirmacao'] != $ArDados['StNovaSenha']) {
            $this->saveReturn('A confirmação não bate com a senha digitada e avaliada.');
        }

        if (!$this->hasReturn()) {
            if ($this->usuarioService->changePassword($ArDados['StNovaSenha'])) {
                $this->saveReturn('Sua senha foi alterada com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao trocar sua senha');
            }
        }

        $this->showJsonResponse();
    }

    /**
     * @method  editarPreferencias
     *
     * Manipula o post para atualizacao das ferramentas e preferencias
     *
     * @since   Novembro de 2011
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function editarPreferencias() {
        $StMessage = '';
        $ArDados = $_POST;
        $ArPreferencias = array('ItMaximoFerramentas' => $ArDados['ItMaximoFerramentas']);
        $ArFerramentasHabilitadas = explode(', ', $ArDados['IDFerramentas']);
        if (empty($ArDados['ItMaximoFerramentas'])) {
            $this->saveReturn('N&uacute;mero de ferramentas não recebido');
        }
        if (count($ArFerramentasHabilitadas) > $ArDados['ItMaximoFerramentas']) {
            $this->saveReturn('O n&uacute;mero m&aacute;ximo de ferramentas foi excedido.');
        }
        if (empty($StMessage)) {
            multipleEntities($ArDados);
            $BoPreferencias = $this->usuarioService->updatePreferences($ArPreferencias);
            $BoFerramentasHabilitadas = $this->ferramentaService->saveToolsStatus($ArFerramentasHabilitadas);
            if ($BoFerramentasHabilitadas && $BoPreferencias) {
                $this->saveReturn('Atualiza&ccedil;&otilde;es realizadas com sucesso', 1);
            } else {
                $this->saveReturn('Erro ao realizar algumas Atualiza&ccedil;&otilde;es');
            }
        }

        $this->showJsonResponse();
    }

    public function contraCheque() {
        $this->view('contra_cheque', self::PACKAGE_VIEW);
    }

    public function teste() {
//        $tMysqli = MyDb::getInstance();
//        $tMysqli->getConnection(MYSQL_HOST, MYSQL_USER,MYSQL_PASS, MYSQL_DB);
//        $a = new Usuario(16, $tMysqli, true);
        $a = Dracosys::getLoggedUser();
        morra($a->getTPerfil());
        var_dump($a->can('Marcar/Desmarcar Chamado Prioridade'));

//        morra(Dracosys::getLoggedUser()->getTPerfil()->getActions());
    }

}

?>
